Git wijzigingen terugdraaien
- git revert
- git clean
Bron
git revert
Het git revert
commando maakt een neergelegde momentopname (commit) ongedaan. Maar doe commit wordt niet verwijderd uit de geschiedenis van het project. Git maakt de wijzigingen ongedaan die door de commit werden aangebracht en voegt een nieuwe commit toe waarin het resultaat staat van deze operatie. Op die manier gaat er niets uit de geschiedenis van je project verloren, wat belangrijk is voor de integriteit van je revisiegeschiedenis en voor een betrouwbare samenwerking.
Wat hier aan voorafgaat
De toestand van de myap werkmap en de repo is zoals ze is nadat je de voorbeelden in Git vorige versies inspecteren hebt gemaakt.
We hebben de volgende commit geschiedenis:
C:\myap>git log --oneline 9af1508 Vera eerste versie hersteld f2afd87 Vondel eerste versie toegevoegd 76367c9 Vera derde versie ac43111 Vera tweede versie b3a2046 Vera eerste versie
In de praktijk
git revert <commit>
Genereer een nieuwe commit, die alle wijzigingen, die in de <commit> zijn aangebracht, ongedaan maakt en pas dat toe op in de gebruik zijnde tak.
Dit is de toestand in de werkmap nu:
C:\myap>dir Volume in drive C is Windows Volume Serial Number is C6F4-3FE3 Directory of C:\myap 26/01/2017 12:19 <DIR> . 26/01/2017 12:19 <DIR> .. 25/01/2017 14:39 14 .gitignore 26/01/2017 12:19 83 Vera.txt 26/01/2017 12:19 265 Vondel.txt 3 File(s) 362 bytes 2 Dir(s) 100 490 403 840 bytes free C:\myap>type Vera.txt Ambrosia, wat vloeit mij aan? uw schedelveld is koeler maan en alle appels blozen C:\myap>
We willen terugkeren naar de commit van f2afd87 Vondel eerste versie toegevoegd:
Je wordt gevraagd een commit boodschap op te geven indien je er geen hebt meegegeven. Accepteer de opgegeven boodschap, sla die op en verlaat de editor met Esc Z Z.
En dat is de toestand in werkmap nu:
C:\myap>git log --oneline 9af1508 Vera eerste versie hersteld f2afd87 Vondel eerste versie toegevoegd 76367c9 Vera derde versie ac43111 Vera tweede versie b3a2046 Vera eerste versie C:\myap>git revert f2afd87 [master 7b57a41] Revert "Vondel eerste versie toegevoegd" 1 file changed, 11 deletions(-) delete mode 100644 Vondel.txt C:\myap>dir Volume in drive C is Windows Volume Serial Number is C6F4-3FE3 Directory of C:\myap 28/01/2017 12:54 <DIR> . 28/01/2017 12:54 <DIR> .. 25/01/2017 14:39 14 .gitignore 26/01/2017 12:19 83 Vera.txt 2 File(s) 97 bytes 2 Dir(s) 100 488 675 328 bytes free C:\myap>type Vera.txt Ambrosia, wat vloeit mij aan? uw schedelveld is koeler maan en alle appels blozen C:\myap>git log --oneline 7b57a41 Revert "Vondel eerste versie toegevoegd" 9af1508 Vera eerste versie hersteld f2afd87 Vondel eerste versie toegevoegd 76367c9 Vera derde versie ac43111 Vera tweede versie b3a2046 Vera eerste versie
We beklagen ons de laatste revert en willen die ongedaan maken:
C:\myap>git revert 7b57a41 [master eae692f] Revert "Revert "Vondel eerste versie toegevoegd"" 1 file changed, 11 insertions(+) create mode 100644 Vondel.txt C:\myap>dir Volume in drive C is Windows Volume Serial Number is C6F4-3FE3 Directory of C:\myap 28/01/2017 13:09 <DIR> . 28/01/2017 13:09 <DIR> .. 25/01/2017 14:39 14 .gitignore 26/01/2017 12:19 83 Vera.txt 28/01/2017 13:09 265 Vondel.txt 3 File(s) 362 bytes 2 Dir(s) 100 487 270 400 bytes free C:\myap>type vera.txt Ambrosia, wat vloeit mij aan? uw schedelveld is koeler maan en alle appels blozen C:\myap>type Vondel.txt Joost van den Vondel Geuze-Vesper of Ziekentroost voor de Vierenentwintig Had hij Holland dan gedragen, Onder 't hart, Tot zijn afgeleefde dagen, Met veel smart, Om 't meinedig zwaard te laven, Met zijn bloed, En te mesten kraai en raven Op zijn goed ? C:\myap>
Terugdraaien (revert) doe je wanneer je alle wijzigingen van één commit wilt verwijderen een hele plegen van je projectgeschiedenis. Dit kan handig zijn, bijvoorbeeld, als alleen de wijzigingen sinds de laatste commit wilt ongedaan maken. In plaats van dat manueel te doen en een nieuwe commit uit te voeren, die je gewoon een git revert
om dat automatisch te laten gebeuren.
Het is belangrijk in te zien dat een git revert slechts de wijzigingen van één enkele commit ongedaan maakt en dus niet terugkeert naar de vorige toestand van het project door alle daarop volgende commits te verwijderen. Dat is immers een git reset
(Git wijzigingen ongedaan maken).
Een visuele voorstelling van het verschil tussen revert
en reset
:
Revert
is om twee redenen beter dan reset
:
Revert
verandert de geschiedenis van het project niet. Op die manier is het veiliger voor commits die al gepubliceerd zijn in een gedeelde repository.Revert
kan uitgevoerd worden van om het even welke commit in de geschiedenis van het project.Reset
kan alleen terugkeren naar een vorige commit vertrekkende van de laaste. Als je een oudere commit zou willen verwijderen metgit reset
, moet je eerst de commits, die na deze oudere commit hebben plaatsgevonden, verwijderen en alle daaropvolgende commits opnieuw neerleggen.
Ik wil nu de derde versie van Vera.txt
terughalen omdat die de meest volledige is. Daarvoor gebruiken we git checkout <commit> <file>
(zie daarvoor Git vorige versies inspecteren).
C:\myap>git log --oneline eae692f Revert "Revert "Vondel eerste versie toegevoegd"" 7b57a41 Revert "Vondel eerste versie toegevoegd" 9af1508 Vera eerste versie hersteld f2afd87 Vondel eerste versie toegevoegd 76367c9 Vera derde versie ac43111 Vera tweede versie b3a2046 Vera eerste versie C:\myap>git checkout 76367c9 Vera.txt C:\myap>type Vera.txt Jan Engelman Vera Janacopoulos Cantilene Ambrosia, wat vloeit mij aan? uw schedelveld is koeler maan en alle appels blozende klankgazelle die ik vond hoe zoete zoele kindermond van zeeschuim en van rozen C:\myap>
Tenslotte voegen we alle wijzigingen in de werkmap toe op de verzamelplaats en leggen we die neer in de bewaarplaats:
C:\myap>git add --all C:\myap>git commit -m "Vondel en Engelman meest volledig" [master 44430ac] Vondel en Engelman meest volledig 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 .gitignore C:\myap>